home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Ham⁄GPS / SoftKiss.src.1.8 Folder / SoftKiss.src.1.8 / core / sfk_core_fake_serial.c < prev    next >
Text File  |  1993-03-12  |  5KB  |  250 lines

  1. /*
  2.  * SoftKiss - kiss mode replacement serial driver
  3.  * Used for kiss mode emulation and soft tnc emulation
  4.  * by Aaron Wohl / N3LIW (aw0g+@andrew.cmu.edu) jul 1992
  5.  * 6393 Penn Ave #303
  6.  * Pittsburgh PA, 15206
  7.  * work: (412)-268-5032
  8.  * home: (412)-731-6159
  9.  */
  10.  
  11. #include "sfk_core.h"
  12. #include "sfk_core_private.h"
  13. #include "driver_shell.h"
  14. #include <Serial.h>
  15.  
  16. /*
  17.  * routines defined in sfk_core_kiss_asm.c
  18.  */
  19. void rp_jiodone(kiss_port_pt p);
  20.  
  21. /*
  22.  * mark the waiting iopb as finished
  23.  */
  24. void sfk_mark_read_done(sfk_prt_pt p,int er_code)
  25. {
  26.     if(p->K_IN.kp_pb==0)
  27.         return;
  28.     p->K_IN.kp_pb->ioResult=er_code;
  29.     rp_jiodone(&p->K_IN);
  30. }
  31.  
  32. /*
  33.  * save the dces from the normal serial drivers
  34.  */
  35. static void drivers_save(sfk_prt_pt p)
  36. {
  37.     long *ubase= (long *)UTableBase;
  38.     int i;
  39.     kiss_port_pt k=p->kports;
  40.     for(i=0;i<NUM_KISS_PORTS;i++,k++) {
  41.         if(k->kp_old!=0)
  42.             continue;
  43.         k->kp_old= *(ubase+(-1-k->kp_refnum));
  44.         *(ubase+(-1-k->kp_refnum))=0;
  45.     }
  46. }
  47.  
  48. /*
  49.  * restore the dces from the normal serial drivers
  50.  */
  51. static void drivers_restore(sfk_prt_pt p)
  52. {
  53.     long *ubase= (long *)UTableBase;
  54.     int i;
  55.     kiss_port_pt k=p->kports;
  56.     for(i=0;i<NUM_KISS_PORTS;i++,k++) {
  57.         if(k->kp_old!=0)
  58.              *(ubase+(-1-k->kp_refnum))=k->kp_old;
  59.         k->kp_old=0;;
  60.     }
  61. }
  62.  
  63. /*
  64.  * remove existing drivers from operating system
  65.  */
  66. static void fake_serial_remove_drivers(sfk_prt_pt p)
  67. {
  68.     //??? check remove errors
  69.     DrvrRemove(p->K_IN.kp_refnum);
  70.     DrvrRemove(p->K_OUT.kp_refnum);
  71. }
  72. /*
  73.  * return a duplicate of the 
  74.  */
  75. static Handle copy_template(sfk_iio_pt cmd)
  76. {
  77.     Handle result;
  78.     if((result=sh_copy_template(sfk_gl.driver_template))==0)
  79.         sfk_parse_fail(cmd,TEXT_NUM(22),0);
  80.     return result;
  81. }
  82.  
  83. /*
  84.  * install one driver, kiss_in or kiss_out or soft_tnc_in or soft_tnc_out
  85.  */
  86. static void fake_serial_install1(
  87.     sfk_iio_pt cmd,
  88.     sfk_prt_pt p,
  89.     kiss_port_pt k,
  90.     long entry_point)
  91. {
  92.     DCtlHandle dCtl;
  93.     Handle drvr_handle=copy_template(cmd);
  94.     driver_shell_header_pt ash= ((driver_shell_header_pt)(*drvr_handle));
  95.     k->kp_state=0;
  96.     k->kp_offset=0;
  97.     if(!sh_prepare(ash,k->kp_name,
  98.             dNeedLock|dStatEnable|dCtlEnable|dRAMBased|
  99.                 (k->kp_is_in?(dReadEnable|dNeedTime):dWritEnable),
  100.             2,
  101.             entry_point,
  102.             sh_geta4(),
  103.             sh_geta5(),
  104.             (long)p))
  105.         sfk_parse_fail(cmd,TEXT_NUM(23),0);
  106.     drivers_save(p);
  107.     if(Real_DrvrInstall(drvr_handle,k->kp_refnum)) 
  108.         sfk_parse_fail(cmd,TEXT_NUM(25),0);
  109.     if((dCtl=GetDCtlEntry(k->kp_refnum))==0)
  110.         sfk_parse_fail(cmd,TEXT_NUM(24),0);
  111.     k->kp_de= dCtl;
  112. }
  113.  
  114. /*
  115.  * initialize input or output static constants
  116.  */
  117. static void fake_serial_init1(
  118.     kiss_port_pt k,
  119.     unsigned char *kp_name,
  120.     int kp_refnum,
  121.     int kp_is_in)
  122. {
  123.     k->kp_refnum=kp_refnum;
  124.     k->kp_is_in=kp_is_in;
  125.     k->kp_name=kp_name;
  126. }
  127.  
  128. /*
  129.  * one time init at open time
  130.  */
  131. static void fake_serial_init(void)
  132. {
  133.     fake_serial_init1(&sfk_PA->K_IN,"\p.AIn",-6,TRUE);
  134.     fake_serial_init1(&sfk_PA->K_OUT,"\p.AOut",-7,FALSE);
  135.     fake_serial_init1(&sfk_PB->K_IN,"\p.BIn",-8,TRUE);
  136.     fake_serial_init1(&sfk_PB->K_OUT,"\p.BOut",-9,FALSE);
  137. }
  138.  
  139. /*
  140.  * is the passed driver refnum in use?
  141.  */
  142. static int is_a_driver_open(int ref_num)
  143. {
  144.   DCtlHandle     dCtl;
  145.   if((dCtl = GetDCtlEntry(ref_num))==0) /*get handle to DCE*/
  146.       return FALSE;
  147.   return (((*dCtl)->dCtlFlags&dOpened)!=0);
  148. }
  149.  
  150. /*
  151.  * see if eithor serial port is in use
  152.  */
  153. int is_serial_busy(sfk_prt_pt p)
  154. {
  155.     return (is_a_driver_open(p->K_IN.kp_refnum)||
  156.             is_a_driver_open(p->K_OUT.kp_refnum));
  157. }
  158.  
  159. /*
  160.  * make shure the serial ports are closed
  161.  */
  162. static void close_serial_ports(sfk_prt_pt p)
  163. {
  164.     FSClose(p->K_IN.kp_refnum);
  165.     FSClose(p->K_OUT.kp_refnum);
  166. }
  167.  
  168. /*
  169.  * fake serial port input
  170.  */
  171. static short fake_serial_in(CntrlParam *pb,DCtlPtr de,short op,void *extra)
  172. {
  173.     sfk_prt_pt p=extra;
  174.     return (*p->K_IN.kp_io)(pb,de,op,extra);
  175. }
  176.  
  177. /*
  178.  * fake serial port output
  179.  */
  180. static short fake_serial_out(CntrlParam *pb,DCtlPtr de,short op,void *extra)
  181. {
  182.     sfk_prt_pt p=extra;
  183.     return (*p->K_OUT.kp_io)(pb,de,op,extra);
  184. }
  185.  
  186. /*
  187.  * enable the fake serial drivers
  188.  */
  189. void fake_serial_on(sfk_iio_pt cmd,sfk_prt_pt p)
  190. {
  191.     fake_serial_init();
  192.     if(p->K_IN.kp_old!=0) return;    /*already on*/
  193.     close_serial_ports(p);
  194.     fake_serial_install1(cmd,p,&p->K_IN,(long)&fake_serial_in);
  195.     fake_serial_install1(cmd,p,&p->K_OUT,(long)&fake_serial_out);
  196. }
  197.  
  198. /*
  199.  * turn off kiss mode on the passed port
  200.  */
  201. void fake_serial_off(sfk_prt_pt p)
  202. {
  203.     fake_serial_init();
  204.     close_serial_ports(p);
  205.     if(p->K_IN.kp_old!=0) {
  206.         fake_serial_remove_drivers(p);
  207.         drivers_restore(p);
  208.     }
  209. }
  210.  
  211. /*
  212.  * install one driver, kiss_in or kiss_out
  213.  */
  214. void sfk_fake_serial_install(
  215.     sfk_iio_pt cmd,
  216.     sfk_prt_pt p,
  217.     kiss_port_pt k_in,
  218.     long entry_point_in,
  219.     kiss_port_pt k_out,
  220.     long entry_point_out)
  221. {
  222.     SFK_UNUSED_ARG(cmd);
  223.     SFK_UNUSED_ARG(p);
  224.     k_in->kp_io=(void*)entry_point_in;
  225.     k_out->kp_io=(void*)entry_point_out;
  226. }
  227.  
  228. /*
  229.  * mark this driver as being open
  230.  * fail if it is already open
  231.  */
  232. int sfk_open_me(DCtlPtr de)
  233. {
  234.     if(de->dCtlStorage!=0)
  235.         return TRUE;
  236.     //we don't really need storage, we use it to tell if we are open
  237.     de->dCtlStorage=NewHandleSysClear(1);
  238.     return FALSE;
  239. }
  240.  
  241. /*
  242.  * mark this driver as being closed
  243.  */
  244. void sfk_close_me(DCtlPtr de)
  245. {
  246.     if(de->dCtlStorage!=0)
  247.         DisposHandle(de->dCtlStorage);
  248.     de->dCtlStorage=0;
  249. }
  250.